/**
 * 使用面向对象处理数据
 */

/**
 * 单件商品的信息
 */
class UIGoods {
  constructor(good) {
    this.data = good;
    this.choose = 0;
  }

  /**
   * 获取单个商品的总价
   * @returns {number} 总价
   */
  getTotalPrice() {
    return this.data.price * this.choose;
  }

  /**
   * 是否选中
   * @returns {boolean} 真值
   */
  isChoose() {
    return this.choose > 0;
  }

  /**
   * 增加商品的数量
   */
  increase() {
    this.choose++;
  }

  /**
   * 减少商品的数量
   * @returns void
   */
  decrease() {
    // 边界问题
    if (this.choose === 0) {
      return;
    }
    this.choose--;
  }
}

/**
 * 整个界面的数据
 */
class UIData {
  constructor() {
    this.uiGoods = goods.map(good => new UIGoods(good));
    this.deliveryThreshold = 30; // 起送费
    this.deliveryPrice = 5; // 配送费
  }

  /**
   * 所有商品的总价
   * @returns {number} 总价
   */
  getTotalPrice() {
    return this.uiGoods.reduce((prev, cur) => prev + cur.getTotalPrice(), 0);
  }

  /**
   * 增加某件商品的选中数量
   * @param {number} index 某件商品
   */
  increase(index) {
    this.uiGoods[index].increase();
  }

  /**
   * 减少某件商品的选中数量
   * @param {number} index 某件商品
   */
  decrease(index) {
    this.uiGoods[index].decrease();
  }

  /**
   * 得到总共的选择数量
   * @returns {number} 所有的选择数量
   */
  getTotalChooseNumber() {
    return this.uiGoods.reduce((prev, cur) => prev + cur.choose, 0);
  }

  /**
   * 购物车中有没有东西
   * @returns {boolean} 真值
   */
  hasGoodsInCar() {
    return this.getTotalChooseNumber() > 0;
  }

  /**
   * 是否跨过了起送标准
   * @returns {boolean} 真值
   */
  isCrossDeliveryThreshold() {
    return this.getTotalPrice() >= this.deliveryThreshold;
  }
}

/**
 * 整个界面
 */
class UI {
  constructor() {
    this.uiData = new UIData();
    this.doms = {};
  }
}

// 测试
const ui = new UIData();
console.log(ui);
